home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1994-09-22 | 2.6 KB | 116 lines |
- IMPLEMENTATION MODULE ExFunc;
-
- (* Implementationsmodul ExFunc Version 1.0 *
- * Copyright: K. Hartlage, Pr.Stroehen 194, 4993 Rahden *
- * Berechnung (Ex-)tra langer (Card-)inalzahlen; *
- * Verbesserungen, Berichtigungen und eigene Anwendungen bitte an die *
- * obige Adresse senden *)
-
- FROM SYSTEM IMPORT ADR,CODE,ADDRESS;
-
- FROM Excard IMPORT
- ExCard;
-
- FROM Excard IMPORT
- Def,CardToExCard,ExEqual,ExLess,ExOdd,ExInc,ExAdd,ExSub,ExMul,
- ExShl,ExShr,ExDiv,ExMod,ExRead,ExWrite ;
-
- PROCEDURE ExFak(VAR facc : ExCard; f : CARDINAL);
- (* facc := f! *)
- VAR i:CARDINAL;
- lx,n:ExCard;
- BEGIN
- CardToExCard(facc,1);
- CardToExCard(lx,1);
- CardToExCard(n,f);
- WHILE ExLess(lx,n) DO
- ExInc(lx);
- ExMul(facc,lx,facc);
- END
- END ExFak;
-
- PROCEDURE MueberN(VAR result : ExCard; m,n : CARDINAL);
- (* result:=m! / (n! * (m-n)! ) *)
- VAR t0,f0,lx,stop : ExCard;
- c1 : CARDINAL;
- BEGIN
- IF (m<n) & (0<=m) THEN
- CardToExCard(result,0);
- ELSIF (m-n=0) OR (n=0) THEN
- CardToExCard(result,1);
- ELSIF n<=m-n THEN
- CardToExCard(f0,1);
- CardToExCard(lx,m-n);
- CardToExCard(stop,m);
- WHILE ExLess(lx,stop) DO
- ExInc(lx);
- ExMul(f0,lx,f0);
- END;
- ExFak(t0,n);
- ExDiv(result,f0,t0);
- ELSE
- CardToExCard(f0,1);
- CardToExCard(lx,n);
- CardToExCard(stop,m);
- WHILE ExLess(lx,stop) DO
- ExInc(lx);
- ExMul(f0,lx,f0);
- END;
- ExFak(t0,m-n);
- ExDiv(result,f0,t0);
- END
- END MueberN;
-
- PROCEDURE ExggT(VAR ggt,n0,m0 : ExCard);
- (* bestimmt groessten gemeinsamen Teiler *)
- VAR rest,temp0,temp1,null : ExCard;
- BEGIN
- CardToExCard(null,0);
- IF ExLess(n0,m0) THEN
- Def(temp0,ADR(m0));
- Def(temp1,ADR(n0))
- ELSE
- Def(temp0,ADR(n0));
- Def(temp1,ADR(m0))
- END;
- CardToExCard(rest,1);
- WHILE NOT ExEqual(rest,null) DO
- ExMod(rest,temp0,temp1);
- Def(temp0,ADR(temp1));
- Def(temp1,ADR(rest));
- END;
- Def(ggt,ADR(temp0));
- END ExggT;
-
- PROCEDURE ExkgV(VAR kgv,n0,m0 : ExCard);
- (* bestimmt kleinstes gemeinsames Vielfaches *)
- VAR ggt,prod : ExCard;
-
- BEGIN
- ExMul(prod,n0,m0);
- ExggT(ggt,n0,m0);
- ExDiv(kgv,prod,ggt);
- END ExkgV;
-
- PROCEDURE ExSum(VAR sum,n : ExCard);
- (* sum := 1+2+3+...+n *)
- VAR dummy : BOOLEAN;
- t0,t1:ExCard;
- BEGIN
- Def(t0,ADR(n));
- IF ExOdd(t0) THEN
- ExInc(t0);
- dummy:=ExShr(t0);
- Def(t1,ADR(n));
- ExMul(sum,t0,t1);
- ELSE
- dummy:=ExShr(t0);
- Def(t1,ADR(n));
- ExInc(t1);
- ExMul(sum,t0,t1);
- END
- END ExSum;
-
- END ExFunc.
-
-